#pragma once

// -lwfrest

#include <wfrest/HttpServer.h>
#include <workflow/WFFacilities.h>
#include <iostream>
#include <string>

#include <unistd.h>  // access(), mkdir() 注册时创建用户空间
#include <sys/stat.h> // 权限宏（如 S_IRWXU）

// #include "Backup.h"

using std::string;

// 装饰者模式 (套壳)
// CloudiskServer 的用法和 HttpServer 的用法非常类似
// 接口一致，可以降低用户的学习成本
class CloudiskServer {
public:
    CloudiskServer() {
        // 创建存储空间
        if(access("./file", F_OK) == 0) {
            printf("文件空间已存在\n");
        } 
        else{
            int ret = mkdir("./file", 0777);
            if(ret == -1) {
                printf("文件空间创建失败!\n");
            }
            printf("文件空间已创建\n");
        }
        printf("\n");
    }

    void register_modules();

    int start(unsigned short port) { 
        return m_server.start(port); 
    }
    
    void stop() { m_server.stop(); }

    void list_routes() { m_server.list_routes(); }

    CloudiskServer& track() {
        m_server.track();
        return *this;
    }

private:
    // 注册路由
    void register_static_resources_module();
    void register_signup_module();
    void register_signin_module();
    void register_userinfo_module();
    void register_filelist_module();
    void register_fileupload_module();
    string sha256_hash(const char *data);
    void register_filedownload_module();
private:
    // 名字中最好不要带具体的实现细节
    // 方便以后修改具体的实现
    wfrest::HttpServer m_server;    // 组合: 有选择的暴露接口
    // string mysqlUrl;
};

